package com.ophiux.wechat.executor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ophiux.wechat.model.CM_OrderQueryResponse;
import com.ophiux.wechat.model.CM_OrderQueryRequest;
import com.ophiux.wechat.utils.CommonUtil;
import com.ophiux.wechat.utils.XmlUtil;

/**
 * 该接口提供所有微信支付订单的查询，商户可以通过查询订单接口主动查询订单状态，完成下一步的业务逻辑。
需要调用查询接口的情况：
◆ 当商户后台、网络、服务器等出现异常，商户系统最终未接收到支付通知；
◆ 调用支付接口后，返回系统错误或未知交易状态情况；
◆ 调用被扫支付API，返回USERPAYING的状态；
◆ 调用关单或撤销接口API之前，需确认支付状态；
 * @author chenh
 * 2016-11-23
 *
 */
public class CM_OrderQueryExecutor implements Executor<CM_OrderQueryResponse>{
	
	private static Logger logger = LoggerFactory.getLogger(CM_OrderQueryExecutor.class);

	private static String ORDER_QUERY_URL =  "https://api.mch.weixin.qq.com/pay/orderquery";
	
	/**
	 * 接口访问结果
	 */
	private static String RETURN_SUCCESS = "SUCCESS";
	private static String RETURN_FAIL = "FAIL";
	/**
	 * 业务结果
	 */
	private static String RESULT_SUCCESS = "SUCCESS";
	private static String RESULT_FAIL = "FAIL";
	
	private CM_OrderQueryRequest order_query_request;
	
	
	public CM_OrderQueryExecutor(CM_OrderQueryRequest _order_query_request){
		this.order_query_request = _order_query_request;
	}
	
	@Override
	public CM_OrderQueryResponse execute() {
		// TODO Auto-generated method stub
		  String return_code="";
		  String result_code="";
		  /**
		   * error_code和err_code_des在查询订单业务失败时有返回值
		   */
		  String error_code = "";
		  String err_code_des=""; //错误代码
		  String trade_state="";  //交易状态
		  String trade_state_desc=""; //交易状态描述
		  String appid="";
	 	  String mch_id ="";
	 	  String nonce_str="";
	 	  String sign ="";
	 	  /**
	 	   * 订单查询参数
	 	   */
	 	 String order_query_param = "<xml>" + 
			        "<appid>" + order_query_request.getAppid() + "</appid>" + 
					"<mch_id>"+ order_query_request.getMch_id()+ "</mch_id>" + 
					"<nonce_str>" + order_query_request.getNonce_str()+ "</nonce_str>" + 
			        "<sign>" + order_query_request.getSign() + "</sign>"+ 
					"<out_trade_no>" + order_query_request.getOut_trade_no()+ "</out_trade_no>"+ 
			        "</xml>";
	 	
	 	 // String err_code="";
	 	 /**
	 	  * 普通商户订单查询结果返回
	 	  */
		  CM_OrderQueryResponse order=new CM_OrderQueryResponse();
		  
		  logger.info(order_query_request.getOut_trade_no()+"微信方订单查询入参:"+order_query_param);
	      try{
	    	  /**
	 	 	  * 执行订单查询
	 	 	  */
	    	  String order_res = CommonUtil.httpsRequest(ORDER_QUERY_URL,
	 	 			 CommonUtil.HTTP_POST, order_query_param);
	    	  logger.info(order_query_request.getOut_trade_no()+"微信方订单查询出参:"+order_res);
	    	  
		     XmlUtil xm=new XmlUtil();
		     return_code=xm.getValue(order_res, "return_code");
		     String return_msg=xm.getValue(order_res, "return_msg");
		     order.setReturn_code(return_code);
		     order.setReturn_msg(return_msg);
		     
		     if(return_code.equals(RETURN_FAIL)){
		    	  
		    	 logger.info("错误原因!"+return_msg);
		    	 
		     }else{
		    	 /**
		    	  * 接口成功
		    	  */
		    	 /**------以下字段在return_code为SUCCESS的时候有返回------------*/
		    	 appid=xm.getValue(order_res, "appid");
		    	 mch_id=xm.getValue(order_res, "mch_id");
		    	 result_code=xm.getValue(order_res, "result_code");
		    	 nonce_str=xm.getValue(order_res, "nonce_str");
		    	 sign=xm.getValue(order_res, "sign");
		    	 
		    	 order.setAppid(appid);
		    	 order.setMch_id(mch_id);
		    	 order.setResult_code(result_code);
		    	 order.setErr_code(error_code);
		    	 order.setErr_code_des(err_code_des);
		    	 order.setNonce_str(nonce_str);
		    	 order.setSign(sign);
		    	 
			     if(return_code.equals(RETURN_SUCCESS) 
			    		 && result_code.equals(RESULT_SUCCESS)){
			    	 /**------以下字段在return_code 和result_code都为SUCCESS的时候有返回------------*/
			    	 String openid=xm.getValue(order_res, "openid");
			    	 String is_subscribe=xm.getValue(order_res, "is_subscribe");
			    	 String  trade_type=xm.getValue(order_res, "trade_type");
			    	 String  bank_type=xm.getValue(order_res, "bank_type");
			    	 String  total_fee=xm.getValue(order_res, "total_fee");
			    	 String transaction_id=xm.getValue(order_res, "transaction_id");
			    	 String  out_trade_no=xm.getValue(order_res, "out_trade_no");
			    	 String  time_end=xm.getValue(order_res, "time_end");
			    	 
			         trade_state = xm.getValue(order_res, "trade_state");
			         /**
			          * trade_state_desc支付文档上存在，但目前微信接口未返回，暂不解析
			          */
			    //   trade_state_desc = xm.getValue(order_res, "trade_state_desc");
			    	 /**
			    	  * 设置响应实体后续参数
			    	  */
			    	 order.setOpenid(openid);
			    	 order.setIs_subscribe(is_subscribe);
			    	 order.setTrade_type(trade_type);
			    	 order.setBank_type(bank_type);
			    	 order.setTotal_fee(total_fee);
			    	 order.setTransaction_id(transaction_id);
			    	 order.setOut_trade_no(out_trade_no);
			    	 order.setTime_end(time_end);
			    	 order.setTrade_state(trade_state);
			     }else{
			    	 /**
			    	  * 订单查询失败
			    	  */
			    	 error_code = xm.getValue(order_res, "err_code");
			    	 err_code_des = xm.getValue(order_res, "err_code_des");
			    	 order.setErr_code(error_code);
			    	 order.setErr_code_des(err_code_des);
			     }
		    	 
		     }
		     System.out.println("result_code="+result_code);
		     System.out.println("return_code="+return_code);
		     System.out.println("err_code_des="+err_code_des);
		     System.out.println("trade_state="+trade_state);
		     System.out.println("trade_state_desc="+trade_state_desc);
		     System.out.println("-----------------------------------");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			 
		}
		return order;
	}

}
